home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / BBS-Archive / Dev / gcc263-src.lha / gcc-2.6.3 / config / i386 / perform.h < prev    next >
Text File  |  1993-11-20  |  3KB  |  98 lines

  1. /* Definitions for AT&T assembler syntax for the Intel 80386.
  2.    Copyright (C) 1993 Free Software Foundation, Inc.
  3.  
  4. This file is part of GNU CC.
  5.  
  6. GNU CC is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2, or (at your option)
  9. any later version.
  10.  
  11. GNU CC is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with GNU CC; see the file COPYING.  If not, write to
  18. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. /* Defines to be able to build libgcc.a with GCC.  */
  21.  
  22. /* It might seem that these are not important, since gcc 2 will never
  23.    call libgcc for these functions.  But programs might be linked with
  24.    code compiled by gcc 1, and then these will be used.  */
  25.  
  26. /* The arg names used to be a and b, but `a' appears inside strings
  27.    and that confuses non-ANSI cpp.  */
  28.  
  29. #define perform_udivsi3(arg0,arg1)                    \
  30. {                                    \
  31.   register int dx asm("dx");                        \
  32.   register int ax asm("ax");                        \
  33.                                     \
  34.   dx = 0;                                \
  35.   ax = arg0;                                \
  36.   asm ("divl %3" : "=a" (ax), "=d" (dx) : "a" (ax), "g" (arg1), "d" (dx)); \
  37.   return ax;                                \
  38. }
  39.  
  40. #define perform_divsi3(arg0,arg1)                    \
  41. {                                    \
  42.   register int dx asm("dx");                        \
  43.   register int ax asm("ax");                        \
  44.   register int cx asm("cx");                        \
  45.                                     \
  46.   ax = arg0;                                \
  47.   cx = arg1;                                \
  48.   asm ("cltd\n\tidivl %3" : "=a" (ax), "=&d" (dx) : "a" (ax), "c" (cx)); \
  49.   return ax;                                \
  50. }
  51.  
  52. #define perform_umodsi3(arg0,arg1)                    \
  53. {                                    \
  54.   register int dx asm("dx");                        \
  55.   register int ax asm("ax");                        \
  56.                                     \
  57.   dx = 0;                                \
  58.   ax = arg0;                                \
  59.   asm ("divl %3" : "=a" (ax), "=d" (dx) : "a" (ax), "g" (arg1), "d" (dx)); \
  60.   return dx;                                \
  61. }
  62.  
  63. #define perform_modsi3(arg0,arg1)                    \
  64. {                                    \
  65.   register int dx asm("dx");                        \
  66.   register int ax asm("ax");                        \
  67.   register int cx asm("cx");                        \
  68.                                     \
  69.   ax = arg0;                                \
  70.   cx = arg1;                                \
  71.   asm ("cltd\n\tidivl %3" : "=a" (ax), "=&d" (dx) : "a" (ax), "c" (cx)); \
  72.   return dx;                                \
  73. }
  74.  
  75. #define perform_fixdfsi(arg0)                        \
  76. {                                    \
  77.   auto unsigned short ostatus;                        \
  78.   auto unsigned short nstatus;                        \
  79.   auto int ret;                                \
  80.   auto double tmp;                            \
  81.                                     \
  82.   &ostatus;            /* guarantee these land in memory */    \
  83.   &nstatus;                                \
  84.   &ret;                                    \
  85.   &tmp;                                    \
  86.                                     \
  87.   asm volatile ("fnstcw %0" : "=m" (ostatus));                \
  88.   nstatus = ostatus | 0x0c00;                        \
  89.   asm volatile ("fldcw %0" : /* no outputs */ : "m" (nstatus));        \
  90.   tmp = arg0;                                \
  91.   asm volatile ("fldl %0" : /* no outputs */ : "m" (tmp));        \
  92.   asm volatile ("fistpl %0" : "=m" (ret));                \
  93.   asm volatile ("fldcw %0" : /* no outputs */ : "m" (ostatus));        \
  94.                                     \
  95.   return ret;                                \
  96. }
  97.  
  98.